package controller

import (
	model "carmanager/models"
	"carmanager/models/dto"
	"carmanager/server"
	"carmanager/util"
	"fmt"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
)

type CarController struct {
	server server.CarService
}

func NewCarController() CarController {
	return CarController{
		server: server.CarService{},
	}
}
func (c *CarController) List(ctx *gin.Context) {
	// 将request的body中的数据，自动按照json格式解析到结构体
	var json dto.PageParms
	// 将request的body中的数据，自动按照json格式解析到结构体
	var carDto dto.CarDto
	if err := ctx.ShouldBindBodyWith(&json, binding.JSON); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}
	if err := ctx.ShouldBindBodyWith(&carDto, binding.JSON); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}
	res, list := c.server.List(carDto, json)
	if !res {
		util.Error(ctx, int(util.ApiCode.FAILED), "获取失败")
		return
	}
	util.Success(ctx, list)
}
func (c *CarController) MyList(ctx *gin.Context) {
	// 将request的body中的数据，自动按照json格式解析到结构体
	var json dto.PageParms
	// 将request的body中的数据，自动按照json格式解析到结构体
	var carDto dto.CarDto

	userToken, err := util.PaserToken(ctx.GetHeader("Authorization"))
	if err != nil {
		util.Error(ctx, int(util.ApiCode.FAILED), "请先登录！")
		return
	}

	if err := ctx.ShouldBindBodyWith(&json, binding.JSON); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}

	if err := ctx.ShouldBindBodyWith(&carDto, binding.JSON); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}

	carDto.UserId = int(userToken.UserId)
	fmt.Println(carDto)
	res, list := c.server.List(carDto, json)
	if !res {
		util.Error(ctx, int(util.ApiCode.FAILED), "获取失败")
		return
	}
	util.Success(ctx, list)
}

func (c *CarController) StopCar(ctx *gin.Context) {
	var json dto.CarDto
	userToken, err := util.PaserToken(ctx.GetHeader("Authorization"))
	if err != nil {
		util.Error(ctx, int(util.ApiCode.FAILED), "请先登录！")
		return
	}
	// 将request的body中的数据，自动按照json格式解析到结构体
	if err := ctx.ShouldBindJSON(&json); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}
	json.UserId = int(userToken.UserId)
	res := c.server.StopCar(json)
	if !res {
		util.Error(ctx, int(util.ApiCode.FAILED), "添加失败！")
		return
	}

	util.Success(ctx, "添加成功！")
}

func (r *CarController) Del(ctx *gin.Context) {
	idQuery := ctx.DefaultQuery("id", "")
	if strings.EqualFold(idQuery, "") {
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误!!")
		return
	}
	var id int
	var err error
	if id, err = strconv.Atoi(idQuery); err != nil {
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误!!")
		return
	}

	if r.server.Del(id) {
		util.Error(ctx, int(util.ApiCode.FAILED), "删除失败 请稍后在试!")
		return
	}

	util.Success(ctx, "删除成功")

}

func (r *CarController) OutBoud(ctx *gin.Context) {
	idQuery := ctx.DefaultQuery("id", "")
	if strings.EqualFold(idQuery, "") {
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误!!")
		return
	}
	var id int
	var err error
	if id, err = strconv.Atoi(idQuery); err != nil {
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误!!")
		return
	}

	placeMemory := r.server.OutBoud(id)
	util.Success(ctx, placeMemory)
}

func (r *CarController) Update(ctx *gin.Context) {

	var json model.Car
	// 将request的body中的数据，自动按照json格式解析到结构体

	if err := ctx.ShouldBindJSON(&json); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}
	if r.server.Update(json) {
		util.Error(ctx, int(util.ApiCode.FAILED), "修改失败")
		return
	}

	util.Success(ctx, "修改成功")
}

func (r *CarController) Add(ctx *gin.Context) {

	var json model.Car
	// 将request的body中的数据，自动按照json格式解析到结构体

	if err := ctx.ShouldBindJSON(&json); err != nil {
		fmt.Print(err)
		util.Error(ctx, int(util.ApiCode.FAILED), "参数错误")
		return
	}
	if r.server.Add(json) {

		util.Error(ctx, int(util.ApiCode.FAILED), "修改失败")
		return
	}

	util.Success(ctx, "修改成功")
}
